home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-06-25 | 59.6 KB | 2,304 lines |
- This is an official patch to nn release 6.4
- -------------------------------------------
-
- PATCH #6
-
- Priority: MEDIUM
-
-
- These patches fix a major and a few minor bugs in the 6.4 release, and
- add some new features based on patches and suggestions sent to me.
-
- It provides the capability for 8 bit (ISO 8859) keyboard input.
-
- It fixes a nasty bug which could cause nnmaster to die during expire
- (method 1) if all articles in the first group had been expired.
-
- Problems related to the nn* utilities asking to add new groups to
- .newsrc if new-group-action is set to 4 or 5 have been solved by
- (silently) using action 3 (add new groups unconditionally), but
- without updating .newsrc or the LAST file.
-
- NOTICE: The following change to entry macro semantics is *not*
- backwards compatible.
-
- Without this patch installed, only the commands :set, :unset, and
- :local will be executed prior to article collection if they occur at
- the beginning of an entry macro.
-
- With this patch, ALL `:' commands at the beginning of an entry macro
- will be executed prior to article collection! To postpone the
- execution of a `:' command until after article collection and showing
- the first menu page, a double `::' can be used, e.g.
-
- on entry comp.sources* alt.sources
- :set cross-post on # set before collection
- :local auto-read-mode on # set before showing menu
- ::unset cross-post # unset after collection
- end
-
- This change was done to make entry macros more powerful, but also to
- allow the new "start-up" macro (executed before entering the first
- group) to contain commands like ":show groups", e.g.
-
- on start-up
- :show groups sequence
- end
-
- All changes are described in the updated RELEASE_NOTES file (read that
- for details about this patch). Thanks to all who reported bugs and
- provided fixes.
-
- To apply this patch, use nn's :patch command, or run this command from
- the shell in the root of the nn source tree:
- patch -p0 < this-article
-
-
- ++Kim Storm
-
- *** ./LAST/Makefile Wed May 16 11:23:32 1990
- --- Makefile Wed Jun 20 23:02:58 1990
- ***************
- *** 17,24 ****
- # -----------------------------------------------------------------
- #
- # make all compile programs
- - # make install install programs
- - # make initdb initialize database
- # make clean remove all make'd files from source directory
- #
- # no changes are needed below this line
- --- 17,22 ----
- ***************
- *** 44,63 ****
- lint: ymakefile
- $(MAKE) -f ymakefile lint
-
- - install: ymakefile
- - $(MAKE) $(MFLAGS) -f ymakefile install
- -
- - initdb: ymakefile
- - $(MAKE) $(MFLAGS) -f ymakefile initdb
- -
- - online: ymakefile
- - $(MAKE) $(MFLAGS) -f ymakefile online.manual
- -
- client: ymakefile
- $(MAKE) $(MFLAGS) -f ymakefile client
- -
- - install.client: ymakefile
- - $(MAKE) $(MFLAGS) -f ymakefile install.client
-
- ymakefile: Makefile xmakefile config.h
- cp xmakefile MF.c
- --- 42,49 ----
- *** ./LAST/account.c Fri May 4 16:19:28 1990
- --- account.c Fri Jun 22 23:22:27 1990
- ***************
- *** 26,31 ****
- --- 26,34 ----
- * The COST_PER_MINUTE should be the price per minute multiplied
- * by 100 (to allow prices like $0.03/minute).
- * The definitions below corresponds to 1 Kroner per minute.
- + *
- + * If COST_PER_MINUTE is not defined (you can #undef it in config.h),
- + * a "Time used" rather than a "Cost" report is produced.
- */
-
- #define ACCTLOG /* */
- ***************
- *** 244,249 ****
- --- 247,255 ----
- ((long)ses * COST_PER_MINUTE) / 100, COST_UNIT);
- printf("%6ld %s",
- (ac->ac_total * COST_PER_MINUTE) / 100, COST_UNIT);
- + #else
- + printf("Time used this session: %d.%02d Period total: %ld.%02ld",
- + ses/60, ses%60, ac->ac_total/60, ac->ac_total%60);
- #endif
- if (ses >= 0 && ac->ac_quota > 0) {
- r = ac->ac_quota - ac->ac_total/60;
- ***************
- *** 377,382 ****
- --- 383,391 ----
- if (ck_policy >= 0) {
- #ifdef AUTHORIZE
- get_entry(acctf, caller, &ac);
- + #ifdef ACCOUNTING
- + if (ac.ac_quota > 0 && ac.ac_quota < ac.ac_total/60) exit(4);
- + #endif
- exit(policy_check(ac.ac_policy));
- #else
- exit(0);
- ***************
- *** 433,444 ****
- if (add_usage > 0) {
- put_entry(acctf, &ac);
- if (report) {
- - #ifdef COST_PER_MINUTE
- do_cost(&ac, add_usage);
- - #else
- - strcpy(ac.ac_user, "Total:");
- - do_report(&ac, 0);
- - #endif
- }
- fclose(acctf);
- #ifdef ACCTLOG
- --- 442,448 ----
- *** ./LAST/admin.c Tue May 29 18:36:16 1990
- --- admin.c Fri Jun 22 22:14:12 1990
- ***************
- *** 25,30 ****
- --- 25,31 ----
-
- extern int group_completion();
-
- + extern group_header *lookup_regexp();
-
- static get_cmd(prompt1, prompt2)
- char *prompt1, *prompt2;
- ***************
- *** 814,824 ****
- new_group:
- if ((groupname = get_groupname()) == NULL) return;
-
- ! gh = lookup(groupname);
- ! if (gh == NULL) {
- ! printf("No group named %s\n", groupname);
- goto new_group;
- - }
-
- have_group:
- if (!use_nntp && init_group(gh)) {
- --- 815,822 ----
- new_group:
- if ((groupname = get_groupname()) == NULL) return;
-
- ! if ((gh = lookup_regexp(groupname, "Enter", 0)) == NULL)
- goto new_group;
-
- have_group:
- if (!use_nntp && init_group(gh)) {
- *** ./LAST/answer.c Tue Jun 12 11:46:24 1990
- --- answer.c Mon Jun 25 11:14:41 1990
- ***************
- *** 21,26 ****
- --- 21,28 ----
- export char *news_script = NULL;
- export char *mailer_program = REC_MAIL;
- export int mailer_pipe_input = 1;
- + export char *inews_program = NULL;
- + export int inews_pipe_input = 1;
- export char *editor_program = NULL;
- export char *spell_checker = NULL;
-
- ***************
- *** 231,236 ****
- --- 233,239 ----
- char *args[10], *fn;
- char route[512], *poster;
- register char **ap = args;
- + import int use_mmdf_folders;
- import int novice;
- import char *pager;
- #ifdef NNTP
- ***************
- *** 243,248 ****
- --- 246,254 ----
- return 1;
- }
-
- + if (getenv("LOGNAME") == NULL)
- + aux_param_str(param, "*LOGNAME", user_name());
- +
- if (strcmp(prog, "cancel") == 0) {
- aux_param_str(param, "ART_ID", action); /* article id for cancel */
- aux_param_str(param, "GROUP", record); /* group name for cancel */
- ***************
- *** 265,270 ****
- --- 271,279 ----
- aux_param_bool(param, "MAILER_PIPE", mailer_pipe_input);
- aux_param_int(param, "WAIT_PERIOD", response_check_pause);
- aux_param_str(param, "DFLT_ANSW", response_dflt_answer);
- + aux_param_str(param, "POST", inews_program);
- + aux_param_bool(param, "POST_PIPE", inews_pipe_input);
- + aux_param_str(param, "MMDF_SEP", use_mmdf_folders ? "\1\1\1\1" : "");
-
- if (current_group != NULL) {
- aux_param_str(param, "*G", current_group->group_name);
- ***************
- *** 360,367 ****
- }
-
- if (ah->flag & A_DIGEST) {
- ! if (digest.dg_from)
- ! news.ng_path = news.ng_from = digest.dg_from;
- if (digest.dg_subj)
- news.ng_subj = digest.dg_subj;
- }
- --- 369,378 ----
- }
-
- if (ah->flag & A_DIGEST) {
- ! if (digest.dg_from) {
- ! if (news.ng_reply) news.ng_from = news.ng_reply;
- ! news.ng_reply = digest.dg_from;
- ! }
- if (digest.dg_subj)
- news.ng_subj = digest.dg_subj;
- }
- ***************
- *** 558,563 ****
- --- 569,575 ----
- if (command != K_MAIL_OR_FORWARD || ftell(art) < ah->fpos)
- fputs(included_mark, t);
- prevnl = 0;
- + if (c == NL) continue;
- }
- putc(c, t);
- }
- ***************
- *** 699,704 ****
- --- 711,717 ----
-
- init_term(1);
- visit_init_file(0, (char *)NULL);
- + init_answer();
- current_group = NULL;
-
- ngroups =
- ***************
- *** 868,870 ****
- --- 881,897 ----
- return 1;
- }
-
- + init_answer()
- + {
- + extern char *news_lib_directory;
- + char buf[FILENAME + 5];
- +
- + #ifndef INEWS_PATH
- + #define INEWS_PATH relative(news_lib_directory, "inews")
- + #endif
- +
- + if (inews_program == NULL) {
- + sprintf(buf, "%s -h", INEWS_PATH);
- + inews_program = copy_str(buf);
- + }
- + }
- *** ./LAST/aux.sh Tue Jun 12 11:46:27 1990
- --- aux.sh Mon Jun 25 13:55:48 1990
- ***************
- *** 1,9 ****
-
- # PREFIX is inserted above this line during Make
-
- - # make anne.jones happy (she is lost without a tty)
- - exec 3<&0
- -
- trap : 2 3
-
- PATH=/bin:$PATH
- --- 1,6 ----
- ***************
- *** 24,29 ****
- --- 21,30 ----
- # NOVICE [expert]
- # WAIT_PERIOD [response-check-pause]
- # RECORD [mail/news-record]
- + # MMDF_SEP [mmdf-format = ^A^A^A^A]
- + # POST [inews]
- + # POST_PIPE [inews-pipe-input]
- + # POSTER_ADR Reply address for follow-ups
- # MAILER [mailer]
- # MAILER_PIPE [mailer-pipe-input]
- # DFLT_ANSW [response-default-answer]
- ***************
- *** 298,303 ****
- --- 299,307 ----
- {
- # keep a copy of message in $RECORD (in mail format)
- set `date`
- + if [ -n "$MMDF_SEP" ] ; then
- + echo "$MMDF_SEP"
- + fi
- if [ $3 -gt 9 ] ; then
- echo From ${LOGNAME} $1 $2 $3 $4 $6 $7
- else
- ***************
- *** 305,311 ****
- fi
- echo "From: ${LOGNAME}"
- cat $FINAL
- ! echo ''
- } >> "$RECORD"
- fi
-
- --- 309,315 ----
- fi
- echo "From: ${LOGNAME}"
- cat $FINAL
- ! echo "$MMDF_SEP"
- } >> "$RECORD"
- fi
-
- ***************
- *** 327,334 ****
-
- follow|post)
- {
- ! $INEWS -h < $FINAL
- ! case $? in
- 0) sleep 60 ;;
- *) echo $INEWS failed ;;
- esac
- --- 331,344 ----
-
- follow|post)
- {
- ! if ${POST_PIPE} ; then
- ! $POST < $FINAL
- ! x=$?
- ! else
- ! $POST $FINAL
- ! x=$?
- ! fi
- ! case $x in
- 0) sleep 60 ;;
- *) echo $INEWS failed ;;
- esac
- *** ./LAST/doc/RELEASE_NOTES Tue Jun 12 11:46:32 1990
- --- doc/RELEASE_NOTES Mon Jun 25 11:14:40 1990
- ***************
- *** 796,802 ****
- --- 796,889 ----
- From: pak@regent.e-technik.tu-muenchen.dbp.de (Peter A. Krauss)
- Fixed: Patch #5 [new parsing of string variables]
-
- + Prog: nnmaster -E1
- + Title: If the first expired group's directory is empty, master may crash.
- + From: robert@sysint.uucp (Robert Nelson)
- + Fixed: Patch #6 [expire.c]
-
- + Prog: mini-inews
- + Title: netinet/in.h included twice if network_database is defined.
- + From: Peter A. Krauss <pak@regent.e-technik.tu-muenchen.de>
- + Fixed: Patch #6 [inews/clientlib.c]
- +
- + Prog: nn
- + Title: Patch #5 breaks init file parsing on some systems
- + From: rob@dutncp9.TUDELFT.NL (Rob Kurver)
- + srp@cgl.ucsf.EDU (Scott R. Presnell)
- + Fixed: Patch #6 [global.h]
- +
- + Prog: aux
- + Title: Patch #5 "exec 3<&0" in aux breaks editors on Apollos (at least)
- + From: Ian Hoyle <ianh@bhpmrl.oz.au>
- + Fixed: Patch #6 [answer.c aux.sh global.h -- LOGNAME is set instead]
- +
- + Prog: nn
- + Title: Completion may incorrectly use col 80 of last line.
- + From: Uwe Doering <gemini@geminix.mbx.sub.org> + fix
- + Fixed: Patch #6 [term.c]
- +
- + Prog: all
- + Title: file_exist does not check permissions correctly for "unusual" modes.
- + From: Lars Henrik Mathiesen <thorinn@diku.dk>
- + Fixed: Patch #6 [global.c - file_exist rewritten!]
- +
- + Prog: nn
- + Title: entry-report-limit = 1 does not work for one article
- + From: Jaap Vermeulen <jaap%sequent@relay.EU.net> + fix
- + Fixed: Patch #6 [group.c]
- +
- + Prog: nn
- + Title: Reply-To: in the digest header overrides subarticles' From: lines
- + From: boomer@eleazar.dartmouth.edu (Rich Akerboom)
- + Fixed: Patch #6 [answer.c]
- +
- + Prog: nncheck + nngrep + nntidy + nngoback + ???
- + Title: new-group-action=4 causes problems with new groups.
- + From: Peter Andersen <datpete@daimi.dk>
- + mshappe@heights.CIT.CORNELL.EDU (Michael Shappe WR)
- + Fixed: Patch #6 [newsrc.c nn.c]
- +
- + Prog: nn
- + Title: "space" cannot be seen on key map displays
- + From: pak@regent.e-technik.tu-muenchen.dbp.de (Peter A. Krauss)
- + Fixed: Patch #6 [keymap.c -- now shown as "space"]
- +
- + Prog: aux
- + Title: record files are not written in MMDF format when mmdf-format is set.
- + From: gpvos@cs.vu.nl (Vos G P)
- + Fixed: Patch #6 [answer.c aux.sh]
- +
- + Prog: nn
- + Title: Name of unknown environment variables is printed using format %d
- + From: weyh@ladwp.UUCP (Darwin C. Weyh)
- + Fixed: Patch #6 [folder.c]
- +
- + Prog: nn
- + Title: "pp" in reading mode marks previous (read) article unread
- + From: Art Messenger <art@wilbur.coyote.trw.com>
- + Fixed: Patch #6 [menu.c]
- +
- + Prog: nn
- + Title: '*' in reading mode leaves current article unread
- + From: Jaap Vermeulen <jaap%sequent@relay.EU.net>
- + Fixed: Patch #6 [menu.c]
- +
- + Prog: nn
- + Title: include-mark-blank-lines duplicates new-lines in included text
- + From: Uwe Doering <gemini@geminix.mbx.sub.org> + fix
- + Fixed: Patch #6 [answer.c]
- +
- + Prog: Makefile
- + Title: initdb and install entries were left over from release 6.3
- + From: rrr@hare.udev.cdc.com (Richard R Ragan)
- + Fixed: Patch #6 [Makefile]
- +
- + Prog: nn, nnacct
- + Title: AUTHORIZATION and QUOTA checks did not work as intended.
- + From: KFS
- + Fixed: Patch #6 [account.c execute.c]
- +
- +
- New features since initial 6.4.0 release
- ----------------------------------------
-
- ***************
- *** 902,904 ****
- --- 989,1054 ----
- Title: New "kill-debug" variable to enable tracing of the auto-kill process.
- From: KFS
- Added: Patch #5 [kill.c variable.c nn.1]
- +
- + Prog: nnacct
- + Title: "Time Used" reports are given if COST_PER_MINUTE is #undef'ed
- + From: KFS on request from Tim Chown <tjc@ecs.soton.ac.uk>
- + Added: Patch #6 [account.c]
- +
- + Prog: nn
- + Title: 8-bit cleanup (Keymaps are expanded to 8-bits if data-bits=8)
- + From: marius@rhi.hi.is (Marius Olafsson) (adapted by KFS)
- + Added: Patch #6 [global.h init.c keymap.c keymap.h term.c nn.1]
- +
- + If data-bits is 8, keyboard input will be 8-bit as well.
- + Things like "map menu 0xc5 select" will now work.
- + The positions 0x80-0x9f are reserved for function keys (so if
- + they are used, they will overlay the function keys)!
- + All national ISO 8859/* character sets are supported.
- + PC codepages are not fully supported (they have national
- + characters in the reserved area).
- +
- + Prog: nnmaster
- + Title: New -h option to avoid nnmaster competing with rnews unbatching
- + From: KFS on request from Roger Fujii <rmf@media.uucp>
- + Added: Patch #6 [master.c nnmaster.8]
- +
- + Prog: nn
- + Title: New "auto reading mode" controlled by auto-read-mode-limit variable.
- + From: KFS on several requests for "rn compatibility"
- + Added: Patch #6 [menu.c variable.c nn.1]
- +
- + Prog: nn
- + Title: "G group" will now try regexp matching if group not found.
- + From: KFS on request from Rich Akerboom <boomer@eleazar.dartmouth.edu>
- + Added: Patch #6 [group.c nn.1]
- +
- + Prog: nn, aux
- + Title: New variables: inews and inews-pipe-input (similar to mailer* vars)
- + From: KFS on request from Jaap Vermeulen <jaap%sequent@relay.EU.net>
- + Added: Patch #6 [answer.c aux.sh variable.c nn.1]
- +
- + Prog: nn
- + Title: New "on start-up" construct executed before entering first group.
- + From: KFS on request from Doug Walker <dougw@fdls.odag.or.gov>
- + Added: Patch #6 [init.c macro.c nn.c nn.1]
- +
- + Prog: nn
- + Title: New "on program ..." construct for program specific initializations
- + From: KFS
- + Added: Patch #6 [init.c nn.1]
- +
- + Prog: nn
- + Title: New ":show groups sequence" variation equivalent to the Y command.
- + From: KFS
- + Added: Patch #6 [init.c nn.1]
- +
- + Prog: nn
- + Title: Reading mode prompt contents changed (new var: new-style-read-prompt)
- + From: KFS on request from karl@sugar.hackercorp.com (Karl Lehenbauer)
- + Added: Patch #6 [menu.c more.c variable.c]
- +
- + Prog: nn
- + Title: Header printed by :print now configurable via print-header-type
- + From: KFS on request from Mikael.C.Kjaerulff@copenhagen.ncr.dk
- + Added: Patch #6 [save.c variable.c nn.1]
- *** ./LAST/execute.c Mon Apr 23 18:26:15 1990
- --- execute.c Fri Jun 22 11:41:54 1990
- ***************
- *** 72,78 ****
-
- if (was_raw) raw();
-
- ! return status != 0;
- }
-
-
- --- 72,78 ----
-
- if (was_raw) raw();
-
- ! return (status & 0xff) ? 0x100 : (status >> 8);
- }
-
-
- *** ./LAST/expire.c Tue Jun 12 11:46:33 1990
- --- expire.c Thu Jun 14 22:07:46 1990
- ***************
- *** 70,78 ****
- count++;
- }
- closedir(dirp);
- ! if (count)
- ! quicksort(article_list, count, article_number, sort_art_list);
- ! *art = 0;
-
- return article_list;
- }
- --- 70,81 ----
- count++;
- }
- closedir(dirp);
- !
- ! if (article_list != NULL) {
- ! *art = 0;
- ! if (count > 1)
- ! quicksort(article_list, count, article_number, sort_art_list);
- ! }
-
- return article_list;
- }
- *** ./LAST/folder.c Tue May 29 18:36:25 1990
- --- folder.c Wed Jun 20 21:59:25 1990
- ***************
- *** 88,94 ****
- if ((cp = getenv(envar)) != NULL)
- while (*cp) *dp++ = *cp++;
- else {
- ! msg("Environment variable $(%d) not set", envar);
- return 0;
- }
- }
- --- 88,94 ----
- if ((cp = getenv(envar)) != NULL)
- while (*cp) *dp++ = *cp++;
- else {
- ! msg("Environment variable $(%s) not set", envar);
- return 0;
- }
- }
- *** ./LAST/global.c Tue Jun 12 11:46:35 1990
- --- global.c Mon Jun 25 11:54:53 1990
- ***************
- *** 38,43 ****
- --- 38,44 ----
-
- export char version_id[32];
-
- + export unsigned short user_eid;
- export unsigned short user_id, group_id;
- export int process_id;
- export int who_am_i;
- ***************
- *** 58,63 ****
- --- 59,66 ----
- {
- int n;
-
- + if (gid == group_id) return 1;
- +
- for (n = 0; n < ngroups; ++n)
- if (gidset[n] == gid) return 1;
-
- ***************
- *** 178,187 ****
-
- #ifdef HAVE_MULTIGROUP
- ngroups = getgroups(NGROUPS, gidset); /* Get users's group set */
- - group_id = gidset[0]; /* not used, but just in case... */
- - #else
- - group_id = getgid();
- #endif
-
- process_id = getpid();
-
- --- 181,189 ----
-
- #ifdef HAVE_MULTIGROUP
- ngroups = getgroups(NGROUPS, gidset); /* Get users's group set */
- #endif
- + group_id = getegid();
- + user_eid = geteuid();
-
- process_id = getpid();
-
- ***************
- *** 355,362 ****
- int size;
- register FILE *f;
- {
- ! register char c, *s = buf;
- ! register int n = size;
-
- while (--n > 0) {
- c = getc(f);
- --- 357,364 ----
- int size;
- register FILE *f;
- {
- ! register char *s = buf;
- ! register int c, n = size;
-
- while (--n > 0) {
- c = getc(f);
- ***************
- *** 447,457 ****
- --- 449,467 ----
- {
- struct stat statb;
- extern int errno;
- + int mask;
-
- if (stat(name, &statb)) return 0;
-
- if (mode == NULL) return statb.st_mtime;
-
- + if (statb.st_uid == user_eid)
- + mask = 0700;
- + else if (group_access(statb.st_gid))
- + mask = 0070;
- + else
- + mask = 0007;
- +
- while (*mode) {
- switch (*mode++) {
- case 'd':
- ***************
- *** 467,485 ****
- }
- break;
- case 'r':
- ! if ((statb.st_mode & 0400) && statb.st_uid == user_id) continue;
- ! if ((statb.st_mode & 0040) && group_access(statb.st_gid)) continue;
- ! if ((statb.st_mode & 0004)) continue;
- break;
- case 'w':
- ! if ((statb.st_mode & 0200) && statb.st_uid == user_id) continue;
- ! if ((statb.st_mode & 0020) && group_access(statb.st_gid)) continue;
- ! if ((statb.st_mode & 0002)) continue;
- break;
- case 'x':
- ! if ((statb.st_mode & 0100) && statb.st_uid == user_id) continue;
- ! if ((statb.st_mode & 0010) && group_access(statb.st_gid)) continue;
- ! if ((statb.st_mode & 0001)) continue;
- break;
- }
- errno = EACCES;
- --- 477,489 ----
- }
- break;
- case 'r':
- ! if (statb.st_mode & mask & 0444) continue;
- break;
- case 'w':
- ! if (statb.st_mode & mask & 0222) continue;
- break;
- case 'x':
- ! if (statb.st_mode & mask & 0111) continue;
- break;
- }
- errno = EACCES;
- ***************
- *** 581,586 ****
- --- 585,592 ----
- if (who_am_i == I_AM_EXPIRE) return "X";
-
- if (user == NULL) {
- + extern char *getlogin();
- + if (user = getlogin()) return user;
- pw = getpwuid((int)user_id);
- if (pw == NULL) user = "?";
- user = copy_str(pw->pw_name);
- *** ./LAST/global.h Sun Apr 29 23:11:59 1990
- --- global.h Fri Jun 22 22:51:47 1990
- ***************
- *** 225,227 ****
- --- 225,240 ----
-
- #define Loop_Groups_Newsrc(gh) \
- for (gh = rc_sequence; gh; gh = gh->newsrc_seq)
- +
- + /* 8 bit support (ISO 8859/...) */
- +
- + #ifdef HAVE_8BIT_CTYPE
- + #ifdef isascii
- + #undef isascii
- + #endif
- + #define isascii(c) 1
- +
- + #define iso8859(c) (isprint(c))
- + #else
- + #define iso8859(c) ((c) & 0x60)
- + #endif
- *** ./LAST/group.c Tue Jun 12 11:46:35 1990
- --- group.c Mon Jun 25 11:54:16 1990
- ***************
- *** 10,15 ****
- --- 10,16 ----
- #include "term.h"
- #include "menu.h"
- #include "keymap.h"
- + #include "regexp.h"
- #ifdef HAVE_SYSLOG
- #include <syslog.h>
- #endif
- ***************
- *** 268,274 ****
- }
-
- if (entry_message_limit &&
- ! (n = gh->last_db_article - gh->current_first) >= entry_message_limit) {
- clrdisp();
- printf("Reading %s: %ld articles...", gh->group_name, (long)n);
- } else
- --- 269,275 ----
- }
-
- if (entry_message_limit &&
- ! (n = gh->last_db_article - gh->current_first + 1) >= entry_message_limit) {
- clrdisp();
- printf("Reading %s: %ld articles...", gh->group_name, (long)n);
- } else
- ***************
- *** 356,362 ****
- --- 357,418 ----
- return menu_cmd;
- }
-
- + static l_re_query(pr, gh)
- + char *pr;
- + group_header *gh;
- + {
- + if (pr == NULL) return 1;
- +
- + prompt("\1%s\1 %s ? ", pr, gh->group_name);
- + return yes(0);
- + }
- +
- + group_header *lookup_regexp(name, pr, flag)
- + char *name, *pr;
- + int flag; /* 1=>seq order, 2=>msg(err) */
- + {
- + group_header *gh;
- + regexp *re;
- + int y, any;
- + char *err;
- +
- + if (gh = lookup(name)) return gh;
- +
- + if ((re = regcomp(name)) == NULL) return NULL;
- + y = any = 0;
- +
- + if (flag & 1)
- + Loop_Groups_Sequence(gh) {
- + if (gh->last_db_article == 0) continue;
- + if (gh->last_db_article < gh->first_db_article) continue;
- + if (!regexec(re, gh->group_name)) continue;
- + any++;
- + if (y = l_re_query(pr, gh)) goto ok;
- + }
- +
- + Loop_Groups_Sorted(gh) {
- + if (flag & 1) {
- + if (gh->master_flag & M_IGNORE_GROUP) continue;
- + if (gh->group_flag & G_SEQUENCE) continue;
- + }
- + if (!regexec(re, gh->group_name)) continue;
- + any++;
- + if (y = l_re_query(pr, gh)) goto ok;
- + }
- +
- + err = any ? "No more groups" : "No group";
- + if (flag & 2)
- + msg("%s matching `%s'", err, name);
- + else
- + printf("\n\r%s matching `%s'\n\r", err, name);
-
- + gh = NULL;
- +
- + ok:
- + freeobj(re);
- + return y < 0 ? NULL : gh;
- + }
- +
- goto_group(command, ah, access_mode)
- int command;
- article_header *ah;
- ***************
- *** 584,593 ****
- break;
- }
-
- ! if ((gh = lookup(answer)) == NULL) {
- ! msg("No group named %s", answer);
- goto_return(ME_NO_REDRAW);
- - }
-
-
- get_first:
- --- 640,647 ----
- break;
- }
-
- ! if ((gh = lookup_regexp(answer, "Goto", 3)) == NULL)
- goto_return(ME_NO_REDRAW);
-
-
- get_first:
- ***************
- *** 961,966 ****
- --- 1015,1021 ----
- if (amount <= 1 && gh->unread_count <= 0) continue;
- if (amount == 0 && (gh->group_flag & G_UNSUBSCRIBED)) continue;
- if (amount == 3 && (gh->group_flag & G_UNSUBSCRIBED) == 0) continue;
- + if (amount == 4 && (gh->group_flag & G_SEQUENCE) == 0) continue;
-
- if (disp_group(gh) < 0) break;
- }
- *** ./LAST/inews/clientlib.c Wed May 16 11:23:37 1990
- --- inews/clientlib.c Tue Jun 19 20:19:59 1990
- ***************
- *** 23,29 ****
- --- 23,35 ----
- #include <sys/types.h>
- #endif
- #include <sys/socket.h>
- + #ifdef FOR_NN
- + #if !defined(NETWORK_DATABASE) || defined(NETWORK_BYTE_ORDER)
- #include <netinet/in.h>
- + #endif
- + #else
- + #include <netinet/in.h>
- + #endif
- #ifndef EXCELAN
- # include <netdb.h>
- #endif not EXCELAN
- *** ./LAST/inews/conf.h Tue May 1 22:31:35 1990
- --- inews/conf.h Fri Jun 22 21:49:52 1990
- ***************
- *** 98,103 ****
- --- 98,109 ----
- #define index strchr
- #endif
-
- + #ifdef NO_BZERO
- + #ifndef USG
- + #define USG
- + #endif
- + #endif
- +
- /*
- * Sanity checks (You know. Checks you get from Sanity Claus)
- */
- *** ./LAST/init.c Tue Jun 12 11:46:37 1990
- --- init.c Thu Jun 21 22:16:49 1990
- ***************
- *** 58,64 ****
- {
- if (cmd == NULL) return cmd;
-
- ! while (*cmd && isspace(*cmd)) cmd++;
- if (*cmd == NUL || *cmd == NL) return NULL;
-
- return cmd;
- --- 58,64 ----
- {
- if (cmd == NULL) return cmd;
-
- ! while (*cmd && isascii(*cmd) && isspace(*cmd)) cmd++;
- if (*cmd == NUL || *cmd == NL) return NULL;
-
- return cmd;
- ***************
- *** 94,100 ****
- if (argc <= i)
- if (cmd = argvec[argc])
- while (argc <= i) {
- ! while (*cmd && !isspace(*cmd)) cmd++;
- if (*cmd == NUL) {
- argc = MAXARG;
- break;
- --- 94,100 ----
- if (argc <= i)
- if (cmd = argvec[argc])
- while (argc <= i) {
- ! while (*cmd && (!isascii(*cmd) || !isspace(*cmd))) cmd++;
- if (*cmd == NUL) {
- argc = MAXARG;
- break;
- ***************
- *** 534,539 ****
- --- 534,545 ----
- if ARG(mode_arg, "unsub")
- group_overview(3);
- else
- + if ARG(mode_arg, "subscr")
- + group_overview(4);
- + else
- + if ARG(mode_arg, "sequence")
- + group_overview(-1);
- + else
- group_overview(0);
-
- break;
- ***************
- *** 641,647 ****
- bind_to = K_function(argv(1)[1] - '0');
- else {
- bind_to = parse_key(argv(1) + 1);
- ! if (bind_to <= 0x80) break; /* not pretty! */
- }
-
- for (i = 2, mb = multi_buffer; argv(i); i++)
- --- 647,653 ----
- bind_to = K_function(argv(1)[1] - '0');
- else {
- bind_to = parse_key(argv(1) + 1);
- ! if (bind_to < K_up_arrow || bind_to > K_right_arrow) break;
- }
-
- for (i = 2, mb = multi_buffer; argv(i); i++)
- ***************
- *** 706,712 ****
-
- if (code == K_EQUAL_KEY) {
- if (argv(4))
- ! code = menu_key_map[parse_key(argv(4))];
- else
- goto mac_err;
- } else
- --- 712,718 ----
-
- if (code == K_EQUAL_KEY) {
- if (argv(4))
- ! code = more_key_map[parse_key(argv(4))];
- else
- goto mac_err;
- } else
- ***************
- *** 805,810 ****
- --- 811,838 ----
- for (i = 2; argv(i) != NULL; i++)
- if (strcmp(argv(2), local_host) == 0) return;
- break;
- + }
- +
- + CASE( "program" ) {
- + extern char *pname;
- + char *pname1;
- + int i;
- +
- + for (pname1 = pname; *pname1 == 'n'; pname1++);
- +
- + for (i = 2; argv(i) != NULL; i++) {
- + if (strcmp(argv(i), pname) == 0) return;
- + if (pname1[0] && strcmp(argv(i), pname1) == 0) return;
- + }
- + break;
- + }
- +
- + CASE( "start-up" ) {
- + import char *start_up_macro;
- + char *parse_enter_macro();
- +
- + start_up_macro = parse_enter_macro(f, NL);
- + return;
- }
-
- goto on_err;
- *** ./LAST/keymap.c Tue May 22 12:53:42 1990
- --- keymap.c Wed Jun 20 20:22:48 1990
- ***************
- *** 8,15 ****
- --- 8,40 ----
- #include "keymap.h"
- #include "term.h"
-
- + import int data_bits;
-
- /*
- + * KEY MAP LAYOUT:
- + * 128 normal ASCII chars
- + * 0200 -- unused
- + * 4 arrow keys #up/down/left/right
- + * 10 multi keys #0-#9
- + * 17 spare keys
- + * 95 national 8-bit characters (8859/x)
- + * 0377 is unused (since we must be able to test c<KEY_MAP_SIZE)
- + *
- + * The encoding of the keymap arrays are performed in
- + * keymap.c (initialization + key_name/parse_key)
- + */
- +
- + /* in keymap.h, MULTI_KEYS include ARROW_KEYS for term.c */
- + #undef MULTI_KEYS
- +
- + #define NORMAL_KEYS 129 /* include 0200 for convenience */
- + #define ARROW_KEYS 4
- + #define MULTI_KEYS 10
- + #define SPARE_KEYS 17
- + #define NATIONAL_KEYS 96
- + #define KEY_MAP_SIZE 255
- +
- + /*
- * standard keyboard mapping for more()
- *
- * redraw ^L, ^R
- ***************
- *** 522,527 ****
- --- 547,556 ----
- register struct command_name_map *cnmp;
-
- for (c = 0; c < KEY_MAP_SIZE; c++) global_key_map[c] = c;
- + for (c = NORMAL_KEYS+ARROW_KEYS; c < KEY_MAP_SIZE; c++) {
- + menu_key_map[c] = K_UNBOUND;
- + more_key_map[c] = K_UNBOUND;
- + }
-
- for (cnmp = command_name_map; cnmp->cmd_name; cnmp++);
- name_map_size = cnmp - command_name_map;
- ***************
- *** 650,656 ****
- int x;
-
- if (str[1] == NUL)
- ! return str[0] & 0177;
-
- if (str[0] == '^')
- if (str[1] == '?')
- --- 679,685 ----
- int x;
-
- if (str[1] == NUL)
- ! return (data_bits < 8) ? (str[0] & 0177) : str[0];
-
- if (str[0] == '^')
- if (str[1] == '?')
- ***************
- *** 667,678 ****
- else
- sscanf(str, "%d", &x);
-
- ! return x & 0177;
- }
-
- if (str[0] == '#' && isdigit(str[1]))
- return K_function(str[1] - '0');
-
- if (strcmp(str, "up") == 0)
- return K_up_arrow;
-
- --- 696,709 ----
- else
- sscanf(str, "%d", &x);
-
- ! return x;
- }
-
- if (str[0] == '#' && isdigit(str[1]))
- return K_function(str[1] - '0');
-
- + if (str[0] == '#') str++;
- +
- if (strcmp(str, "up") == 0)
- return K_up_arrow;
-
- ***************
- *** 693,701 ****
- char *key_name(c)
- key_type c;
- {
- ! static char buf[3];
-
- ! if (c & 0200) {
- switch (c) {
- case K_up_arrow:
- return "up";
- --- 724,732 ----
- char *key_name(c)
- key_type c;
- {
- ! static char buf[10];
-
- ! if (c >= NORMAL_KEYS && c <= (KEY_MAP_SIZE-NATIONAL_KEYS)) {
- switch (c) {
- case K_up_arrow:
- return "up";
- ***************
- *** 707,718 ****
- return "right";
- default:
- buf[0] = '#';
- ! buf[1] = (c - K_function(0)) + '0';
- buf[2] = NUL;
- goto out;
- }
- }
-
- if (c < SP) {
- buf[0] = '^';
- buf[1] = c + '@';
- --- 738,753 ----
- return "right";
- default:
- buf[0] = '#';
- ! buf[1] = (c - K_function(0))
- ! + (c >= NORMAL_KEYS+ARROW_KEYS+MULTI_KEYS) ? 'A' : '0';
- buf[2] = NUL;
- goto out;
- }
- }
-
- + if (c == SP)
- + return "space";
- +
- if (c < SP) {
- buf[0] = '^';
- buf[1] = c + '@';
- ***************
- *** 722,727 ****
- --- 757,767 ----
-
- if (c == 0177) {
- strcpy(buf, "^?");
- + goto out;
- + }
- +
- + if (data_bits < 8 && c >= NORMAL_KEYS) {
- + sprintf(buf, "0x%02x", c);
- goto out;
- }
-
- *** ./LAST/keymap.h Tue May 22 12:53:42 1990
- --- keymap.h Wed Jun 13 15:56:09 1990
- ***************
- *** 104,118 ****
- #define K_MACRO 0x0100 /* call macro */
- #define K_ARTICLE_ID 0x0200 /* article id in lower part */
-
-
- ! /*
- ! * KEY MAP SIZE is:
- ! * (128 normal chars) + (0200) + (4 arrow keys) + (10 function keys)
- ! */
- !
- ! #define MULTI_KEYS (1 + 4 + 10)
- ! #define KEY_MAP_SIZE (128 + MULTI_KEYS)
- !
-
- /* restrictions */
-
- --- 104,112 ----
- #define K_MACRO 0x0100 /* call macro */
- #define K_ARTICLE_ID 0x0200 /* article id in lower part */
-
- + /* keymap definitions from keymap.c */
-
- ! #define MULTI_KEYS 15
-
- /* restrictions */
-
- *** ./LAST/macro.c Tue Jun 12 11:46:40 1990
- --- macro.c Wed Jun 20 22:30:08 1990
- ***************
- *** 12,17 ****
- --- 12,18 ----
- export int get_from_macro = 0;
- export int macro_debug = 0;
- export char *dflt_enter_macro = NULL;
- + export char *start_up_macro = NULL;
-
- #define M_DUMMY 0 /* do nothing (end of branch) */
-
- ***************
- *** 263,271 ****
- --- 264,278 ----
- if (*lp == ':') {
- lp++;
- if (initial_set_commands) {
- + #ifdef REL_640_COMPAT
- if (strncmp(lp, "local", 5) == 0 ||
- strncmp(lp, "set", 3) == 0 ||
- strncmp(lp, "unset", 5) == 0) {
- + #else
- + if (lp[0] == ':')
- + lp++;
- + else {
- + #endif
- m_new(M_SET_COMMAND);
- m->m_string = copy_str(lp);
- break;
- ***************
- *** 428,433 ****
- --- 435,445 ----
- m_invoke(n)
- int n;
- {
- + if (n == -2) {
- + n = NMACRO;
- + if ((macro[n] = (struct macro *)start_up_macro) == NULL)
- + return;
- + } else
- if (n < 0) {
- n = NMACRO;
- if ((macro[n] = (struct macro *)(current_group->enter_macro)) == NULL)
- *** ./LAST/man/nn.1.B Tue Jun 12 11:46:45 1990
- --- man/nn.1.B Mon Jun 25 15:18:12 1990
- ***************
- *** 276,281 ****
- --- 276,285 ----
- .TP
- \fIletter\fP
- The answer is taken to be the name of a newsgroup.
- + If a news group with the given name does not exist, \fInn\fP will
- + treat the answer as a regular expression and locate the first group
- + in the presentation sequence (or among all groups) whose name matches
- + the expression.
- .TP
- .I +
- .br
- ***************
- *** 824,829 ****
- --- 828,835 ----
- group, depending on \fImode\fP: \fBall\fP (list the number of unread
- articles in all groups including groups which you have unsubscribed
- to), \fBtotal\fP (list the total number of articles in all existing
- + groups), \fBsequence\fP (list unread groups in presentation sequence
- + order), \fBsubscr\fP (list all subscribed
- groups), \fBunsub\fP (list unsubscribed groups only). Any other
- \fImode\fP results in a listing of the number of unread articles in
- all subscribed groups including those you have suppressed with the `!'
- *** ./LAST/man/nn.1.C Tue Jun 12 11:46:48 1990
- --- man/nn.1.C Mon Jun 25 15:18:12 1990
- ***************
- *** 194,199 ****
- --- 194,209 ----
- command at the end of the article and the `=' {\fBgoto-menu\fP}
- returns to the menu immediately as usual.
- .TP
- + \fBauto-read-mode-limit\fP \fIN\fP (integer, default 0)
- + When operating in \fIauto reading mode\fP, \fInn\fP will
- + \fIauto-select\fP all unread articles in the group, skip the
- + article selection phase, and enter reading mode directly after
- + entry to the group.
- + Auto reading mode is disabled when \fBauto-read-mode-limit\fP is
- + zero; it is activated unconditionally if the value is negative, and
- + conditionally if the value is greater than zero and the number of
- + unread articles in the current group does not exceed the given value.
- + .TP
- \fBauto-select-subject\fP (boolean, default false)
- When set, selecting an article from the menu using the article id
- (a-z), all articles on the menu with the same subject will
- ***************
- *** 315,320 ****
- --- 325,334 ----
- using a meta-notation \fBM-\fP\fI7bit-char\fP. If set to 8, these
- characters are sent directly to the screen (unless \fBmonitor\fP is
- set).
- + .sp 0.5v
- + It also controls whether keyboard input is 7 or 8 bits, and thus
- + whether key maps contain 127 or 255 entries. See the key mapping
- + section for more details.
- .TP
- \fBdate\fP (boolean, default true)
- If set \fInn\fP will show the article posting date when articles are
- ***************
- *** 488,493 ****
- --- 502,519 ----
- are very difficult to comprehend. Let's all use the standard folks!
- (And hack inews if it is the 50% rule that bothers you.)
- .TP
- + \fBinews\fP \fIshell-command\fP (string, default "INEWS_PATH -h")
- + The program which is invoked by \fInn\fP to deliver an article to the
- + news transport. The program will be given a complete article
- + including a header containing the newsgroups to which the article is
- + to be posted. See also \fBinews-pipe-input\fP. It is \fInot\fP used
- + when cancelling an article!
- + .TP
- + \fBinews-pipe-input\fP (boolean, default true)
- + When set, the article to be posted will be piped into the \fBinews\fP
- + program. Otherwise, the file containing the article will be given as
- + the first (and only) argument to the \fBinews\fP command.
- + .TP
- \fBkeep-unsubscribed\fP (boolean, default true)
- When set, unsubscribed groups are kept in .newsrc. If not set,
- \fInn\fP will automatically remove all unsubscribed from .newsrc if
- ***************
- *** 653,658 ****
- --- 679,688 ----
- format compatible with the \fIrn\fP news reader (\&.rnlast). This needs
- to be tested!
- .TP
- + \fBnew-style-read-prompt\fP (boolean, default true)
- + When set, the reading mode prompt line includes the group name and the
- + number of selected articles in the group.
- + .TP
- \fBnews-header\fP \fIheaders\fP (string, default not set)
- The \fIheaders\fP string specifies one or more extra header lines
- (separated by semi-colons `;') which are added to the header of
- ***************
- *** 750,755 ****
- --- 780,791 ----
- .TP
- \fBpreview-mark-read\fP (boolean, default true)
- When set, previewing an article will mark the article as read.
- + .TP
- + \fBprint-header-type\fP \fIN\fP (integer, default 1)
- + Specifies what kind of header is printed by the \fB:print\fP command,
- + corresponding to the three \fBsave-*\fP commands: \fI0\fP prints only
- + the article body (no header), \fI1\fP prints a short header,
- + and \fI2\fP prints the full article header.
- .TP
- \fBprinter\fP \fIshell-command\fP (string, default is system dep.)
- This is the default value for the
- *** ./LAST/man/nn.1.D Tue Jun 12 11:46:49 1990
- --- man/nn.1.D Mon Jun 25 15:18:12 1990
- ***************
- *** 544,549 ****
- --- 544,564 ----
- \fB#0\fP through \fB#9\fP
- These symbols represent the ten user-defined multikeys.
- .LP
- + If the variable \fBdata-bits\fP is 7, key maps can specify binding of
- + all keys in the range 0x00 to 0x7F, and the 8th bit will be stripped
- + in all keyboard input.
- + If the variable \fBdata-bits\fP is 8, the 8th bit is not cleared, and
- + key maps are extended to allow binding of keys in the range 0xA0 to
- + 0xFE (corresponding to the national characters defined by the ISO 8859
- + character sets).
- + Binding commands to these keys can be done either by using their
- + numeric value, or directly specifying the 8 bit character in the map
- + command, e.g.
- + .sp 0.5v
- + map menu 0xC8 macro 72
- + .br
- + map key \o'\(aae' %
- + .LP
- To show the current contents of the four tables, the following
- versions of the \fB:map\fP command are available:
- .TP
- ***************
- *** 891,896 ****
- --- 906,916 ----
- The commands are executed if the local host's name occur in the
- \fIhost-name\fP list.
- .TP
- + \fBon program\fP \fIprogram-name\fP...
- + .br
- + The commands are executed if the current program (\fInn\fP,
- + \fInncheck\fP, etc) in the \fIprogram-name\fP list.
- + .TP
- \fBon entry\fP [ \fIgroup list\fP ]
- .br
- These commands (macro format!) are executed every time \fInn\fP enters a
- ***************
- *** 900,917 ****
- associated with the groups in the list. The group list is specified
- using the meta-notations described in the presentation sequence section.
- .sp 0.5v
- ! The `:set', `:unset', and `:local' commands at the beginning of the
- command group are executed \fIbefore\fP \fInn\fP collects the articles
- ! in the group, so it is possible to set variables like
- ! \fBcross-post\fP. The other commands, and :set/:unset commands that
- ! follows a command of another type will be executed immediately
- ! \fIafter\fP the first menu page is presented.
- .sp 0.5v
- .nf
- \fBon entry\fP comp.sources* alt.sources
- ! :local cross-post on
- \fBend\fP
- .fi
- .SH GROUP PRESENTATION SEQUENCE
- News groups are normally presented in the sequence defined in the
- system-wide
- --- 920,949 ----
- associated with the groups in the list. The group list is specified
- using the meta-notations described in the presentation sequence section.
- .sp 0.5v
- ! \fIAll\fP `:' commands at the beginning of the
- command group are executed \fIbefore\fP \fInn\fP collects the articles
- ! in the group, so it is possible to set or unset variables like
- ! \fBcross-post\fP and \fBauto-read-mode\fP before any articles are
- ! collected and the menu is (not) shown.
- ! The non-`:' commands, and `:' commands that follows a command of
- ! another type will be executed immediately \fIafter\fP the first menu
- ! page is presented. The execution of a `:' command can be postponed by
- ! using a double `::' as the command prefix.
- .sp 0.5v
- .nf
- \fBon entry\fP comp.sources* alt.sources
- ! :set cross-post on # set before collection
- ! :local auto-read-mode on # set before showing menu
- ! ::unset cross-post # set after collection
- \fBend\fP
- .fi
- + .TP
- + \fBon start-up\fP
- + .br
- + These `:' commands (macro format!) are executed on start-up just
- + before \fInn\fP enters the first news group. However, postponed
- + commands (i.e. non-`:' commands) will not be executed until the first
- + group is shown (it works like an entry macro).
- .SH GROUP PRESENTATION SEQUENCE
- News groups are normally presented in the sequence defined in the
- system-wide
- *** ./LAST/man/nnmaster.8 Tue May 29 18:36:30 1990
- --- man/nnmaster.8 Mon Jun 25 11:51:52 1990
- ***************
- *** 123,128 ****
- --- 123,137 ----
- I cannot recommend this unless you receive batched news; invoking
- \fInnmaster\fP for every received article sounds too expensive to me.)
- .TP
- + \-\fBh\fP [ \fIsec\fP ]
- + Hold collection of new articles until next scan if new articles have
- + arrived withing the last \fIsec\fP [60] seconds. This is useful to
- + prevent \fInnmaster\fP from competing for disk i/o with an \fIrnews\fP
- + process which is unbatching incoming news, or a running \fIexpire\fP
- + process. It will have the side effect of limiting the number of C:
- + entries in the log, since collection of incoming batches will
- + typically be done in larger thunks.
- + .TP
- .B \-f
- Run \fInnmaster\fP in foreground in daemon mode (see \-\fBr\fP).
- Useful if \fInnmaster\fP is invoked from inittab. (Notice that if you
- *** ./LAST/master.c Tue Jun 12 11:46:51 1990
- --- master.c Mon Jun 25 11:54:15 1990
- ***************
- *** 19,24 ****
- --- 19,25 ----
- *
- * -e [N] expire a group if more than N articles are gone
- * -r N repeat every N minutes
- + * -h N don't update if active file is less than N *seconds* old
- *
- * -f foreground execution (use with -r)
- * -y N retry N times on error
- ***************
- *** 98,103 ****
- --- 99,105 ----
- wakeup_master = 0;
-
- static unsigned
- + hold_updates = 0,
- repeat_delay = 0;
-
-
- ***************
- *** 116,121 ****
- --- 118,124 ----
- 'f', Bool_Option( foreground ),
- 'F', Bool_Option( expire_once ),
- 'G', Bool_Option( reread_groups_file ),
- + 'h', Int_Option_Optional( hold_updates, 60 ),
- #ifdef NNTP
- 'H', Bool_Option( nntp_local_server ),
- #endif
- ***************
- *** 546,551 ****
- --- 549,555 ----
- time_t age_active;
- int group_selection;
- int temp;
- + int skip_pass;
-
- umask(002); /* avoid paranoia */
-
- ***************
- *** 707,718 ****
- sleep(5); /* maybe a temporary glitch ? */
- }
-
- if (unconditional) {
- - master.last_scan = age_active - 60;
- unconditional = 0;
- ! }
-
- ! if (!receive_admin() && age_active <= master.last_scan) {
- if (repeat_delay == 0) break;
- if (s_hangup) break;
- #ifdef NNTP
- --- 711,728 ----
- sleep(5); /* maybe a temporary glitch ? */
- }
-
- + skip_pass = 0;
- +
- if (unconditional) {
- unconditional = 0;
- ! } else
- ! if (age_active <= master.last_scan ||
- ! (hold_updates && (cur_time() - age_active) < hold_updates))
- ! skip_pass = 1;
- !
- ! if (receive_admin()) skip_pass = 0;
-
- ! if (skip_pass) {
- if (repeat_delay == 0) break;
- if (s_hangup) break;
- #ifdef NNTP
- *** ./LAST/menu.c Tue Jun 12 11:46:54 1990
- --- menu.c Fri Jun 22 00:39:46 1990
- ***************
- *** 35,40 ****
- --- 35,41 ----
- export int preview_mark_read = 1; /* previewed articles are A_READ */
- export int select_on_sender = 0; /* find command selects on sender */
- export int auto_select_subject = 0; /* auto select articles with same subj. */
- + export int auto_read_limit = 0; /* ignore auto_read_mode if less articles */
-
- export char delayed_msg[100] = ""; /* give to msg() after redraw */
-
- ***************
- *** 323,329 ****
- --- 324,341 ----
- return 0;
- }
-
- + export long n_selected;
-
- + static count_selected_articles()
- + {
- + register article_number cur;
- +
- + n_selected = 0;
- + for (cur = 0; cur < n_articles; cur++) {
- + if (articles[cur]->attr & A_SELECT) n_selected++;
- + }
- + }
- +
- static show_articles()
- {
- register article_number cur, next, temp;
- ***************
- *** 332,337 ****
- --- 344,350 ----
- register int mode;
- int cmd, prev = -1, again;
- attr_type o_attr;
- + import int new_read_prompt;
-
- do {
- for (cur = 0; cur < n_articles; cur++) {
- ***************
- *** 349,354 ****
- --- 362,370 ----
- o_attr = ah->attr;
- ah->attr = 0;
-
- + if (new_read_prompt)
- + count_selected_articles();
- +
- mode = 0;
- if (prev >= 0) mode |= MM_PREVIOUS;
- if (next == n_articles) mode |= MM_LAST_SELECTED;
- ***************
- *** 382,390 ****
- break;
-
- case MC_PREV:
- if (prev == next) break;
-
- - ah->attr = o_attr;
- next = cur; cur = prev; prev = next;
- goto show;
-
- --- 398,406 ----
- break;
-
- case MC_PREV:
- + ah->attr = o_attr;
- if (prev == next) break;
-
- next = cur; cur = prev; prev = next;
- goto show;
-
- ***************
- *** 400,405 ****
- --- 416,422 ----
- break;
-
- case MC_ALLSUBJ:
- + ah->attr = A_READ;
- for (next = cur+1; next < n_articles; next++) {
- ah = articles[next];
- if ((ah->flag & (A_SAME | A_ALMOST_SAME)) == 0) break;
- ***************
- *** 630,635 ****
- --- 647,654 ----
- extern int alt_cmd_key, in_menu_mode;
- article_number elim_list[3];
- int entry_check;
- + int auto_read;
- + long o_selected;
-
- #define menu_return(cmd) \
- { menu_cmd = (cmd); goto menu_exit; }
- ***************
- *** 638,649 ****
-
- o_firsta = firsta;
- o_mode = in_menu_mode;
- in_menu_mode = 1;
-
- menu_level++;
-
- ! entry_check = menu_level == 1 && conf_group_entry &&
- ! current_group->unread_count > conf_entry_limit;
-
- sprintf(pr_fmt,
- menu_level == 1 ?
- --- 657,675 ----
-
- o_firsta = firsta;
- o_mode = in_menu_mode;
- + o_selected = n_selected;
- +
- in_menu_mode = 1;
-
- menu_level++;
-
- ! if (menu_level == 1) {
- ! entry_check = conf_group_entry && n_articles > conf_entry_limit;
- ! auto_read = auto_read_limit < 0 || n_articles <= auto_read_limit;
- ! } else {
- ! entry_check = 0;
- ! auto_read = 0;
- ! }
-
- sprintf(pr_fmt,
- menu_level == 1 ?
- ***************
- *** 690,701 ****
-
- clrdisp();
-
- ! firstl = CALL(print_header)();
- !
- ! if (entry_check && menu_level == 1) {
- ! /* we do it here to avoid redrawing the group header */
- ! entry_check = 0;
- ! prompt_line = firstl;
- prompt("\1Enter?\1 ");
- if ((temp = yes(0)) <= 0) {
- if (temp < 0) {
- --- 716,723 ----
-
- clrdisp();
-
- ! if (entry_check) {
- ! prompt_line = firstl = CALL(print_header)();
- prompt("\1Enter?\1 ");
- if ((temp = yes(0)) <= 0) {
- if (temp < 0) {
- ***************
- *** 710,715 ****
- --- 732,752 ----
- clrline();
- }
-
- + if (auto_read) {
- + auto_read = entry_check = 0;
- + if (repl_attr_all(0, A_AUTO_SELECT, 0)) {
- + k_cmd = K_READ_GROUP_UPDATE;
- + sprintf(delayed_msg, "Entering %s, %ld articles",
- + current_group->group_name, (long)n_articles);
- + goto do_auto_read;
- + }
- + }
- +
- + if (!entry_check)
- + firstl = CALL(print_header)();
- + entry_check = 0;
- +
- +
- maxa = Lines - preview_window - firstl - 2;
- if (!long_menu) firstl++, maxa -= 2;
-
- ***************
- *** 1539,1544 ****
- --- 1576,1582 ----
-
- no_raw();
-
- + do_auto_read:
- switch (show_articles()) {
-
- case MC_MENU:
- ***************
- *** 1569,1574 ****
- --- 1607,1613 ----
-
- menu_exit:
-
- + n_selected = o_selected;
- firsta = o_firsta;
- in_menu_mode = o_mode;
- menu_level--;
- *** ./LAST/more.c Tue Jun 12 11:46:56 1990
- --- more.c Fri Jun 22 00:39:46 1990
- ***************
- *** 24,29 ****
- --- 24,30 ----
- export int scroll_clear_page = 1;
- export int expired_msg_delay = 1;
- export char *trusted_escapes = NULL;
- + export int new_read_prompt = 1;
-
- import int preview_window;
- import int novice;
- ***************
- *** 115,121 ****
- *cp++ = 'l';
- }
-
- ! strcpy(cp, ")------");
- return buf;
- }
-
- --- 116,122 ----
- *cp++ = 'l';
- }
-
- ! strcpy(cp, new_read_prompt ? ")--" : ")------");
- return buf;
- }
-
- ***************
- *** 224,229 ****
- --- 225,249 ----
-
- stop_line = first_page_lines ? first_page_lines : -1;
-
- + if (new_read_prompt) {
- + import long n_selected;
- +
- + if (mode & (MM_PREVIEW | MM_DIGEST) || n_selected == 0)
- + sprintf(pr_fmt,
- + "\1\2--%s-- %s%s %s--%%s--%%s\1",
- + current_group->group_name,
- + (mode & MM_DIGEST) ? "DIGEST" :
- + (mode & MM_PREVIEW) ? "PREVIEW" : "LAST",
- + (ah->flag & A_NEXT_SAME) ? "+next" : "",
- + novice ? "--help:?" : "");
- + else
- + sprintf(pr_fmt,
- + "\1\2--%s-- %ld MORE%s %s--%%s--%%s\1",
- + current_group->group_name,
- + n_selected,
- + (ah->flag & A_NEXT_SAME) ? "+next" : "",
- + novice ? "--help:?" : "");
- + } else
- sprintf(pr_fmt,
- "\1\2-- %s%s %s-----%%s%s-----%%s\1",
- (mode & MM_PREVIEW) ? "PREVIEW " : "",
- *** ./LAST/newsrc.c Tue Jun 12 11:46:58 1990
- --- newsrc.c Tue Jun 19 23:28:33 1990
- ***************
- *** 223,228 ****
- --- 223,230 ----
- register int i;
- struct stat st;
-
- + if (no_update) return;
- +
- if (new_group_action == RCX_RNLAST) {
- lf = open_file(rnlast_path, OPEN_CREATE|MUST_EXIST);
- fputs(rnlast_line[RN_LAST_GROUP_READ], lf); /* as good as any */
- ***************
- *** 406,412 ****
- if (last_new_gh == NULL || last_new_gh->creation_time <= gh->creation_time)
- last_new_gh = gh;
-
- ! if (new_group_action != RCX_TIME) {
- printf("\nNew group: %s -- append to .newsrc? (y)",
- gh->group_name);
- if (yes(0) <= 0) continue;
- --- 408,414 ----
- if (last_new_gh == NULL || last_new_gh->creation_time <= gh->creation_time)
- last_new_gh = gh;
-
- ! if (new_group_action != RCX_TIME && !no_update) {
- printf("\nNew group: %s -- append to .newsrc? (y)",
- gh->group_name);
- if (yes(0) <= 0) continue;
- ***************
- *** 1494,1500 ****
- total = groups = 0;
-
- if (goback_interact) {
- - init_term(1);
- raw();
- }
-
- --- 1496,1501 ----
- *** ./LAST/nn.c Tue Jun 12 11:46:59 1990
- --- nn.c Thu Jun 21 17:25:40 1990
- ***************
- *** 160,165 ****
- --- 160,168 ----
- gh = group_sequence;
- after_loop = NULL;
-
- + if (access_mode == 0 && !also_read_articles)
- + m_invoke(-2);
- +
- for (;;) {
- group_mode = access_mode;
-
- ***************
- *** 658,663 ****
- --- 661,667 ----
- }
-
- visit_init_file(0, argv[1]);
- + init_answer();
-
- group_name_args =
- parse_options(argc, argv, (char *)NULL, nn_options,
- ***************
- *** 717,722 ****
- --- 721,727 ----
- group_name_args =
- parse_options(argc, argv, (char *)NULL, check_options,
- " [group]...");
- + no_update = 1; /* don't update .newsrc and LAST */
- break;
-
- case I_AM_EMACS:
- ***************
- *** 724,742 ****
- break;
-
- case I_AM_TIDY:
- ! init_term(0);
- visit_init_file(0, (char *)NULL);
- group_name_args = opt_nntidy(argc, argv);
- break;
-
- case I_AM_GOBACK:
- group_name_args = opt_nngoback(argc, &argv);
- break;
-
- case I_AM_GREP:
- visit_init_file(0, (char *)NULL);
- opt_nngrep(argc, argv);
- silent = 1;
- break;
-
- case I_AM_POST:
- --- 729,751 ----
- break;
-
- case I_AM_TIDY:
- ! init_term(1);
- visit_init_file(0, (char *)NULL);
- group_name_args = opt_nntidy(argc, argv);
- break;
-
- case I_AM_GOBACK:
- + init_term(1);
- + visit_init_file(0, (char *)NULL);
- group_name_args = opt_nngoback(argc, &argv);
- break;
-
- case I_AM_GREP:
- + init_term(0);
- visit_init_file(0, (char *)NULL);
- opt_nngrep(argc, argv);
- silent = 1;
- + no_update = 1;
- break;
-
- case I_AM_POST:
- *** ./LAST/patchlevel.h Tue Jun 12 11:47:00 1990
- --- patchlevel.h Fri Jun 22 14:37:22 1990
- ***************
- *** 16,22 ****
- * 1990-05-21: Patch #3 (6.4.3) - HIGH
- * 1990-05-29: Patch #4 (6.4.4) - HIGH
- * 1990-06-11: Patch #5 (6.4.5) - MEDIUM
- */
-
- ! #define PATCHLEVEL 5
-
- --- 16,23 ----
- * 1990-05-21: Patch #3 (6.4.3) - HIGH
- * 1990-05-29: Patch #4 (6.4.4) - HIGH
- * 1990-06-11: Patch #5 (6.4.5) - MEDIUM
- + * 1990-06-25: Patch #6 (6.4.6) - MEDIUM
- */
-
- ! #define PATCHLEVEL 6
-
- *** ./LAST/save.c Tue May 29 18:36:38 1990
- --- save.c Fri Jun 22 12:07:07 1990
- ***************
- *** 48,57 ****
- #define HEADER_HANDLING 0x0f /* what should we do with the header */
-
- #define NO_HEADER 0 /* save without a header */
- ! #define FULL_HEADER 1 /* save with full header */
- ! #define SHORT_HEADER 2 /* save with partial header */
- #define SHORT_HEADER_DG 3 /* save with partial header (digest) */
-
-
- #define SEPARATE_FILES 0x0100 /* save as separate files */
- #define UNIQUE_FILES 0x0200 /* save in unique files */
- --- 48,58 ----
- #define HEADER_HANDLING 0x0f /* what should we do with the header */
-
- #define NO_HEADER 0 /* save without a header */
- ! #define SHORT_HEADER 1 /* save with partial header */
- ! #define FULL_HEADER 2 /* save with full header */
- #define SHORT_HEADER_DG 3 /* save with partial header (digest) */
-
- + export int print_header_type = SHORT_HEADER;
-
- #define SEPARATE_FILES 0x0100 /* save as separate files */
- #define UNIQUE_FILES 0x0200 /* save in unique files */
- ***************
- *** 66,73 ****
-
- static int open_mode[] = {
- SKIP_HEADER,
- - 0,
- FILL_NEWS_HEADER | SKIP_HEADER,
- FILL_DIGEST_HEADER | SKIP_HEADER
- };
-
- --- 67,74 ----
-
- static int open_mode[] = {
- SKIP_HEADER,
- FILL_NEWS_HEADER | SKIP_HEADER,
- + 0,
- FILL_DIGEST_HEADER | SKIP_HEADER
- };
-
- ***************
- *** 291,298 ****
- break;
-
- case K_PRINT:
- ! save_mode = SHORT_HEADER | IS_PIPE;
-
- if (!shell_restrictions && edit_print_command) {
- prompt("\1Print command:\1 ");
- save_name = get_s(NONE, printer, NONE, NULL_FCT);
- --- 292,304 ----
- break;
-
- case K_PRINT:
- ! if (print_header_type < NO_HEADER || print_header_type > FULL_HEADER) {
- ! msg("Invalid 'print-header-type' value %d", print_header_type);
- ! print_header_type = NO_HEADER;
- ! }
-
- + save_mode = print_header_type | IS_PIPE;
- +
- if (!shell_restrictions && edit_print_command) {
- prompt("\1Print command:\1 ");
- save_name = get_s(NONE, printer, NONE, NULL_FCT);
- ***************
- *** 384,389 ****
- --- 390,396 ----
- int was_raw = 0, set_visual = 0;
- char copybuf[FILENAME * 4], uniqbuf[FILENAME];
- flag_type st_flag = A_ST_FILED;
- + int with_header;
-
- if (ah->a_group) init_group(ah->a_group);
-
- ***************
- *** 474,480 ****
- clrline();
- s_pipe = 0;
-
- ! if (mode != NO_HEADER)
- mailbox_format(save_file, 1);
-
- if (mode == FULL_HEADER) {
- --- 481,490 ----
- clrline();
- s_pipe = 0;
-
- ! with_header = mode != NO_HEADER &&
- ! (save_mode & (IS_PIPE | DO_UNSHAR)) == 0;
- !
- ! if (with_header)
- mailbox_format(save_file, 1);
-
- if (mode == FULL_HEADER) {
- ***************
- *** 506,524 ****
- fflush(save_file);
- if (s_pipe) goto broken_pipe;
-
- - mode = mode != NO_HEADER && (save_mode & (IS_PIPE | DO_UNSHAR)) == 0;
- -
- lcount = 0;
- while (ftell(art) < ah->lpos && fgets(copybuf, 512, art)) {
- lcount++;
- if (rot13_active) rot13_line(copybuf);
- ! if (mode && is_header_line(copybuf))
- fputc('~', save_file);
- fputs(copybuf, save_file);
- if (s_pipe) goto broken_pipe;
- }
-
- ! if (mode != NO_HEADER)
- lcount += mailbox_format(save_file, 0);
-
- broken_pipe:
- --- 516,532 ----
- fflush(save_file);
- if (s_pipe) goto broken_pipe;
-
- lcount = 0;
- while (ftell(art) < ah->lpos && fgets(copybuf, 512, art)) {
- lcount++;
- if (rot13_active) rot13_line(copybuf);
- ! if (with_header && is_header_line(copybuf))
- fputc('~', save_file);
- fputs(copybuf, save_file);
- if (s_pipe) goto broken_pipe;
- }
-
- ! if (with_header)
- lcount += mailbox_format(save_file, 0);
-
- broken_pipe:
- *** ./LAST/term.c Tue Jun 12 11:47:02 1990
- --- term.c Fri Jun 22 23:09:47 1990
- ***************
- *** 20,25 ****
- --- 20,27 ----
- extern int s_resized;
- #endif
-
- + import int data_bits;
- +
- struct msg_list {
- char *buf;
- struct msg_list *prev;
- ***************
- *** 408,415 ****
- raw_tty = norm_tty;
-
- #ifdef HAVE_TERMIO
- ! raw_tty.c_iflag &= ~(BRKINT|INLCR|ICRNL|IGNCR);
- ! raw_tty.c_iflag |= IGNBRK|IGNPAR|ISTRIP;
- raw_tty.c_oflag &= ~OPOST;
- raw_tty.c_lflag &= ~(ISIG|ICANON|XCASE|ECHO|NOFLSH);
-
- --- 410,417 ----
- raw_tty = norm_tty;
-
- #ifdef HAVE_TERMIO
- ! raw_tty.c_iflag &= ~(BRKINT|INLCR|ICRNL|IGNCR|ISTRIP);
- ! raw_tty.c_iflag |= IGNBRK|IGNPAR;
- raw_tty.c_oflag &= ~OPOST;
- raw_tty.c_lflag &= ~(ISIG|ICANON|XCASE|ECHO|NOFLSH);
-
- ***************
- *** 866,874 ****
- arm_fake_keyb_sig = 1;
- #endif
- while ((n = read(0, (char *)&c, 1)) > 0) {
- - c &= 0177; /* done by ISTRIP on USG systems */
- #endif
-
- if (ignore_xon_xoff && (c == CONTROL_('Q') || c == CONTROL_('S')))
- continue;
-
- --- 868,877 ----
- arm_fake_keyb_sig = 1;
- #endif
- while ((n = read(0, (char *)&c, 1)) > 0) {
- #endif
-
- + if (data_bits < 8) c &= 0x7f;
- +
- if (ignore_xon_xoff && (c == CONTROL_('Q') || c == CONTROL_('S')))
- continue;
-
- ***************
- *** 987,996 ****
- char *dflt, *prefill, *break_chars;
- fct_type completion;
- {
- ! static char buf[GET_S_BUFFER];
- register char *cp;
- register int i, c, lastc;
- ! char *ret_val = buf;
- int comp_used, comp_len;
- int ostop, max, did_help;
- int hit_count;
- --- 990,999 ----
- char *dflt, *prefill, *break_chars;
- fct_type completion;
- {
- ! static key_type buf[GET_S_BUFFER];
- register char *cp;
- register int i, c, lastc;
- ! char *ret_val = (char *)buf;
- int comp_used, comp_len;
- int ostop, max, did_help;
- int hit_count;
- ***************
- *** 999,1005 ****
- case 0:
- break;
- case 1:
- ! return buf;
- case 2:
- return NULL;
- }
- --- 1002,1008 ----
- case 0:
- break;
- case 1:
- ! return (char *)buf;
- case 2:
- return NULL;
- }
- ***************
- *** 1178,1183 ****
- --- 1181,1189 ----
- break;
- }
-
- + if (data_bits == 8) {
- + if (!iso8859(c)) continue;
- + } else
- if (!isascii(c) || !isprint(c)) continue;
-
- if (i == max) continue;
- ***************
- *** 1209,1214 ****
- --- 1215,1221 ----
- if (str == NULL) {
- cols = Columns;
- line = prompt_line + 1;
- + if (line == Lines - 1) cols--;
-
- gotoxy(0, line);
- clrpage(line);
- *** ./LAST/variable.c Tue Jun 12 11:47:03 1990
- --- variable.c Fri Jun 22 12:09:01 1990
- ***************
- *** 22,27 ****
- --- 22,28 ----
- *header_lines,
- *folder_directory,
- included_mark[],
- + *inews_program,
- *mail_box,
- *mail_record,
- *mail_script,
- ***************
- *** 74,79 ****
- --- 75,81 ----
- include_art_id,
- include_full_header,
- include_mark_blanks,
- + inews_pipe_input,
- keep_rc_backup,
- keep_unsubscribed,
- keep_unsub_long,
- ***************
- *** 83,88 ****
- --- 85,91 ----
- mark_overlap,
- match_parts_equal,
- monitor_mode,
- + new_read_prompt,
- novice,
- preview_mark_read,
- query_signature,
- ***************
- *** 112,117 ****
- --- 115,121 ----
- import int /* integer variables */
- also_read_articles,
- article_limit,
- + auto_read_limit,
- conf_entry_limit,
- collapse_subject,
- Columns,
- ***************
- *** 136,141 ****
- --- 140,146 ----
- overlap,
- preview_continuation,
- preview_window,
- + print_header_type,
- re_layout,
- response_check_pause,
- retry_on_error,
- ***************
- *** 199,204 ****
- --- 204,210 ----
- "attributes", STR 1, (char **)attributes,
- "auto-junk-seen", BOOL 0, (char **)&auto_junk_seen,
- "auto-preview-mode", BOOL 0, (char **)&auto_preview_mode,
- + "auto-read-mode-limit", INT 0, (char **)&auto_read_limit,
- "auto-select-subject", BOOL 0, (char **)&auto_select_subject,
- "backup", BOOL 0, (char **)&keep_rc_backup,
- "backup-suffix", STR 0, (char **)&bak_suffix,
- ***************
- *** 248,253 ****
- --- 254,261 ----
- "include-full-header", BOOL 0, (char **)&include_full_header,
- "include-mark-blank-lines", BOOL 0, (char **)&include_mark_blanks,
- "included-mark", STR 1, (char **)included_mark,
- + "inews", STR 0, (char **)&inews_program,
- + "inews-pipe-input", BOOL 0, (char **)&inews_pipe_input,
- "keep-unsubscribed", BOOL 0, (char **)&keep_unsubscribed,
- "kill", BOOL 0, (char **)&do_kill_handling,
- "kill-debug", BOOL 0, (char **)&kill_debug,
- ***************
- *** 273,278 ****
- --- 281,287 ----
- "mmdf-format", BOOL 0, (char **)&use_mmdf_folders,
- "monitor", BOOL 0, (char **)&monitor_mode,
- "new-group-action", INT 0, (char **)&new_group_action,
- + "new-style-read-prompt", BOOL 0, (char **)&new_read_prompt,
- "news-header", STR 0, (char **)&extra_news_headers,
- "news-record", STR 2, (char **)&news_record,
- "news-script", STR SAFE 2, (char **)&news_script,
- ***************
- *** 290,295 ****
- --- 299,305 ----
- "patch-command", STR SAFE 1, (char **)patch_command,
- "preview-continuation", INT 0, (char **)&preview_continuation,
- "preview-mark-read", BOOL 0, (char **)&preview_mark_read,
- + "print-header-type", INT 0, (char **)&print_header_type,
- "printer", STR SAFE 1, (char **)printer,
- "query-signature", BOOL 0, (char **)&query_signature,
- "quick-count", BOOL 0, (char **)&quick_unread_count,
-